package com.desginer.create.builder;

/**
 * 为什么需要建造者模式?
 * 与工厂模式有何区别?
 * 的局限性构造函数和set方法
 * 建造者模式的解决
 * 构造函数参数过多导致可读性差
 * set方法无法校验必填项属性之间的依赖关系或约束条件无法校验创建不可变对象的需求将校验逻辑放置到Builder类中
 * 创建不可变对象
 * 工厂模式
 * 建造者模式
 * 用于创建不同但相关类型的对象
 * 由给定的参数决定创建哪种类型的对象
 * 用于创建一种类型的复杂对象
 * 通过设置不同的可选参数来定制化创建不同的对象
 */
public class Person {

    private final String name;

    private Person(Builder builder){
        this.name = builder.name;
    }

    public static class Builder {
        private  String name;

        public Builder name(String name){
            this.name = name;
            return this;
        }

        public Person build(){
            // TODO 在这里进行逻辑校验
            return new Person(this);
        }

    }

    public static void main(String[] args) {
        Person person   = new Builder().name("张三").build();
        System.out.println(person.name);
    }
}
